Cosmos (operating System)
   HOME

TheInfoList



OR:

C# Open Source Managed Operating System (Cosmos) is a
toolkit A toolkit is an assembly of tools; set of basic building units for user interfaces. The word toolkit may refer to: * Abstract Window Toolkit * Accessibility Toolkit * Adventure Game Toolkit * B-Toolkit * Battlefield Mod Development Toolkit * Ch ...
for building GUI and command-line based
operating system An operating system (OS) is system software that manages computer hardware, software resources, and provides common services for computer programs. Time-sharing operating systems schedule tasks for efficient use of the system and may also i ...
s, written mostly in the programming language C# and small amounts of a high level assembly language named X#. ''Cosmos'' is a
backronym A backronym is an acronym formed from an already existing word by expanding its letters into the words of a phrase. Backronyms may be invented with either serious or humorous intent, or they may be a type of false etymology or folk etymology. The ...
,Cosmos website: project repository at GitHub
/ref> in that the
acronym An acronym is a word or name formed from the initial components of a longer name or phrase. Acronyms are usually formed from the initial letters of words, as in ''NATO'' (''North Atlantic Treaty Organization''), but sometimes use syllables, as ...
was chosen before the meaning. It is
open-source software Open-source software (OSS) is computer software that is released under a license in which the copyright holder grants users the rights to use, study, change, and distribute the software and its source code to anyone and for any purpose. Op ...
released under a
BSD license BSD licenses are a family of permissive free software licenses, imposing minimal restrictions on the use and distribution of covered software. This is in contrast to copyleft licenses, which have share-alike requirements. The original BSD lice ...
. , Cosmos encompasses an ahead-of-time (AOT) compiler named IL2CPU to translate
Common Intermediate Language Common Intermediate Language (CIL), formerly called Microsoft Intermediate Language (MSIL) or Intermediate Language (IL), is the intermediate language binary instruction set defined within the Common Language Infrastructure (CLI) specification. ...
(CIL) into native instructions. Cosmos compiles user-made programs and associated
libraries A library is a collection of Document, materials, books or media that are accessible for use and not just for display purposes. A library provides physical (hard copies) or electronic media, digital access (soft copies) materials, and may be a ...
using IL2CPU to create a
bootable In computing, booting is the process of starting a computer as initiated via hardware such as a button or by a software command. After it is switched on, a computer's central processing unit (CPU) has no software in its main memory, so some ...
native executable that can be run with no support. The resulting output can be booted from a
USB flash drive Universal Serial Bus (USB) is an industry standard that establishes specifications for cables, connectors and protocols for connection, communication and power supply ( interfacing) between computers, peripherals and other computers. A bro ...
, CD-ROM, over a network via
Preboot Execution Environment In computing, the Preboot eXecution Environment, PXE (most often pronounced as ''pixie'', often called PXE Boot/''pixie boot''.) specification describes a standardized client–server environment that boots a software assembly, retrieved from ...
(PXE), or inside a
virtual machine In computing, a virtual machine (VM) is the virtualization/ emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer. Their implementations may involve specialized h ...
. Recent releases also allow deploying to certain
x86 x86 (also known as 80x86 or the 8086 family) is a family of complex instruction set computer (CISC) instruction set architectures initially developed by Intel based on the Intel 8086 microprocessor and its 8088 variant. The 8086 was intr ...
embedded devices over Universal Serial Bus (
USB Universal Serial Bus (USB) is an industry standard that establishes specifications for cables, connectors and protocols for connection, communication and power supply (interfacing) between computers, peripherals and other computers. A broad ...
). While C# is the primary language used by developers (both on the backend and by end users of Cosmos), many
CLI languages CLI languages are computer programming languages that are used to produce libraries and programs that conform to the Common Language Infrastructure (CLI) specifications. With some notable exceptions, most CLI languages compile entirely to the Comm ...
can be used, provided they compile to pure CIL without the use of Platform Invocation Services (P/Invokes). Cosmos is mainly intended for use with .NET. Cosmos does not aim to become a full operating system, but rather a
toolkit A toolkit is an assembly of tools; set of basic building units for user interfaces. The word toolkit may refer to: * Abstract Window Toolkit * Accessibility Toolkit * Adventure Game Toolkit * B-Toolkit * Battlefield Mod Development Toolkit * Ch ...
to allow other developers to simply and easily build their own operating systems using .NET. It also functions as an abstraction layer, hiding much of the inner workings of the hardware from the eventual developer. Older versions of Cosmos were released in ''Milestones'', with the last being Milestone 5 (released August 2010). More recently, the project switched to simply naming new releases after the latest commit number. Releases of Cosmos are divided into two types: the ''Userkit'', and the ''Devkit''. The Userkit is a pre-packaged release that is updated irregularly, as new and improved features are added. Userkits are generally considered stable, but do not include recent changes and may lack features. The Devkit refers to the
source code In computing, source code, or simply code, is any collection of code, with or without comments, written using a human-readable programming language, usually as plain text. The source code of a program is specially designed to facilitate the w ...
of Cosmos and must be built manually. The Devkits are usually somewhat stable, but they may have some bugs. The Devkit can be acquired on GitHub and uses Git as the source control management. Most work on Cosmos is currently aimed at improving
debugger A debugger or debugging tool is a computer program used to test and debug other programs (the "target" program). The main use of a debugger is to run the target program under controlled conditions that permit the programmer to track its executi ...
functionality and Microsoft Visual Studio integration.
Kernel Kernel may refer to: Computing * Kernel (operating system), the central component of most operating systems * Kernel (image processing), a matrix used for image convolution * Compute kernel, in GPGPU programming * Kernel method, in machine learn ...
work is focused on implementing file systems,
memory management Memory management is a form of resource management applied to computer memory. The essential requirement of memory management is to provide ways to dynamically allocate portions of memory to programs at their request, and free it for reuse when ...
, and developing a reliable network interface.
GRUB Grub can refer to Grub (larva), of the beetle superfamily Scarabaeoidea, or as a slang term for food. It can also refer to: Places * Grub, Appenzell Ausserrhoden, Switzerland * Grub, St. Gallen, Switzerland * Grub (Amerang), a hamlet in Bavar ...
serves as the project's
bootloader A bootloader, also spelled as boot loader or called boot manager and bootstrap loader, is a computer program that is responsible for booting a computer. When a computer is turned off, its softwareincluding operating systems, application code, an ...
.


Origin

The idea for Cosmos was created by Chad Hower and was initially co-developed by Hower and Matthijs ter Woord. Over time, Cosmos has been maintained and improved by many other individuals.


Developing with Cosmos

Cosmos has many facilities to improve the experience of developing operating systems with it, designed to make the process as fast and painless as possible, knowledge of the assembly language is not required to use Cosmos.


Visual Studio integration

A key feature of Cosmos, which separates it from other operating systems of its type, is its tight integration with Microsoft Visual Studio. Code can be written,
compiled In computing, a compiler is a computer program that translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primarily used for programs that ...
, debugged, and run entirely through Visual Studio, with only a few key presses. Cosmos no longer supports Visual Studio 2015,
Visual Studio 2017 Visual Studio is an integrated development environment (IDE) from Microsoft. It is used to develop computer programs including web site, websites, web apps, web services and mobile apps. Visual Studio uses Microsoft software development platfor ...
, or Visual Studio 2019. Now it only supports Visual Studio 2022.


Debugging

Cosmos can be seamlessly debugged through Visual Studio when running over PXE or in a virtual machine. Many standard debugging features are present, such as breakpoints, tracing, and logging. Also, debugging can be done via serial cables, if running on physical hardware. When running in VMWare, Cosmos supports stepping and breakpoints, even while an operating system is running.


Running

Cosmos uses virtualisation to help speed development by allowing developers to test their operating systems without having to restart their computers as often. By default, VMware Player is used, due to its ease of use in terms of integration with the project. Other virtualisation environments are supported as well, such as Bochs and Hyper-V. An ISO disk image may also be generated that can be burned to a USB flash drive, CD-ROM, or similar media. PXE booting is also supported, allowing for remote machines to run Cosmos over a network connection.


Compile process


IL2CPU

To compile .NET CIL into assembly language, Cosmos developers created an ahead-of-time compiler named IL2CPU, designed to parse CIL and output
x86 x86 (also known as 80x86 or the 8086 family) is a family of complex instruction set computer (CISC) instruction set architectures initially developed by Intel based on the Intel 8086 microprocessor and its 8088 variant. The 8086 was intr ...
opcodes. (IL To CPU) is an AOT compiler that is written using a
Common Intermediate Language Common Intermediate Language (CIL), formerly called Microsoft Intermediate Language (MSIL) or Intermediate Language (IL), is the intermediate language binary instruction set defined within the Common Language Infrastructure (CLI) specification. ...
compliant language ( C#). It translates
Common Intermediate Language Common Intermediate Language (CIL), formerly called Microsoft Intermediate Language (MSIL) or Intermediate Language (IL), is the intermediate language binary instruction set defined within the Common Language Infrastructure (CLI) specification. ...
to
machine code In computer programming, machine code is any low-level programming language, consisting of machine language instructions, which are used to control a computer's central processing unit (CPU). Each instruction causes the CPU to perform a ve ...
.


X#

''X#'' is a low-level
programming language A programming language is a system of notation for writing computer programs. Most programming languages are text-based formal languages, but they may also be graphical. They are a kind of computer language. The description of a programming ...
developed for the
x86 x86 (also known as 80x86 or the 8086 family) is a family of complex instruction set computer (CISC) instruction set architectures initially developed by Intel based on the Intel 8086 microprocessor and its 8088 variant. The 8086 was intr ...
processor architecture as a part of Cosmos operating system to make operating system development easier. X# is designed to bring some of C-like language syntax to assembly language. In the beginning, X# was an aid for debugging services of Cosmos. The X# compiler is an open source command-line interface (console) program with an atypical architecture. It parses lines of code into tokens and compares them with patterns. Finally, matched X# code patterns are translated to
intel syntax x86 assembly language is the name for the family of assembly languages which provide some level of backward compatibility with CPUs back to the Intel 8008 microprocessor, which was launched in April 1972. It is used to produce object code for ...
x86 assembly, usually for the YASM assembler. In first versions, X# operation was mostly 1:1 with assembly code, but hasn't been, which is the reason why the X# compiler was written.


Syntax

The syntax of X# is simple. Despite being similar to C, X# syntax differs and is stricter.


Comments

X# supports only one kind of comment, the C++-style single line comment, started with a double forward slash - //.


Constants

X# supports the definition of named constants which are declared outside of functions. Defining a numeric constant is similar to
C++ C++ (pronounced "C plus plus") is a high-level general-purpose programming language created by Danish computer scientist Bjarne Stroustrup as an extension of the C programming language, or "C with Classes". The language has expanded significan ...
; for example: const i = 0. Referencing the constant elsewhere requires a # before the name; for example: - "#i". * To define a string constant, single quotes ('') are used. To use a single quote in a string constant, it must be escaped by placing a backslash before it, as 'I\'m so happy'. X# strings are null terminated. * Hexadecimal constants are prefixed with a dollar sign ($), followed by the constant. ($B8000). * Decimal constants are not decorated but may not start with 0. * Binary and octal constants aren't supported yet.


Labels

Labels in X# are mostly equivalent to labels in other assembly languages. The instruction to jump to a label uses the goto mnemonic, as opposed to the conventional jump or jmp mnemonic. CodeLabel1: goto CodeLabel2:


Namespaces

X# program files must begin with a namespace directive. X# lacks a namespace hierarchy, so any directive will change the current namespace until it's changed again or the file ends. Variables or constants in different namespaces may have the same name as the namespace is prefixed to the member's name on assembly output. Namespaces cannot reference each other except through "cheats" using native-assembly-level operations. namespace FIRST // Everything variable or constant name will be prefixed with FIRST and an underscore. Hence the true full name of the below variable // is FIRST_aVar. var aVar namespace SECOND // It's not a problem to name another variable aVar. Its true name is SECOND_aVar. var aVar namespace FIRST // This code is now back to the FIRST namespace until the file ends.


Functions

All X# executive code should be placed in functions defined by the 'function' keyword. Unlike C, X# does not support any formal parameter declaration in the header of the functions, so the conventional parentheses after the function name are omitted. Because line-fixed patterns are specified in syntax implemented in code parser, the opening curly bracket can't be placed on the next line, unlike in many other C-style languages. function xSharpFunction Because X# is a low-level language, there are no stack frames inserted, so by default, there should be the return EIP address on the top of the stack. X# function calls do contain arguments enclosed in parentheses, unlike in function headers. Arguments passed to functions can be registers, addresses, or constants. These arguments are pushed onto the stack in reverse order. Note that the stack on x86 platforms cannot push or pop one-byte registers. function xSharpFunction function anotherFunction The return keyword returns execution to the return EIP address saved in the stack.


Arithmetic and bitwise operations

X# can work with three low-level data structures: the registers, the stack and the
memory Memory is the faculty of the mind by which data or information is encoded, stored, and retrieved when needed. It is the retention of information over time for the purpose of influencing future action. If past events could not be remembered ...
, on different ports. The registers are the base of all normal operations for X#. A register can be copied to another by writing DST = SRC as opposed to mov or load/store instructions. Registers can be incremented or decremented just as easily. Arithmetic operations (add, subtract, multiply, divide) are written as dest op src where src is a constant, variable, or register, and dest is both an operand and the location where the result is stored. Examples of assignment and arithmetic operations are shown below. ESI = 12345 // assign 12345 to ESI EDX = #constantForEDX // assign #ConstantForEDX to EDX EAX = EBX // move EBX to EAX => mov eax, ebx EAX-- // decrement EAX => dec eax EAX++ // increment EAX => inc eax EAX + 2 // add 2 to eax => add eax, 2 EAX - $80 // subtract 0x80 from eax => sub eax, 0x80 BX * CX // multiply BX by CX => mul cx -- division, multiplication and modulo should preserve registers CX / BX // divide CX by BX => div bx CX mod BX // remainder of CX/BX to BX => div bx Register shifting and rolling is similar to C. DX << 10 // shift left by 10 bits CX >> 8 // shift right by 8 bits EAX <~ 6 // rotate left by 6 bits EAX ~> 4 // rotate right by 4 bits Other bitwise operations are similar to arithmetic operations. DL & $08 // perform bitwise AND on DL with 0x08 and store the result in DL CX , 1 // set the lowest bit of CX to 1 (make it odd) EAX = ~ECX // perform bitwise NOT on ECX and store the result in EAX EAX ^ EAX // erase EAX by XORing it with itself


Stack

Stack manipulation in X# is performed using + and - prefixes, where + pushes a register, value, constant or all registers onto the stack and - pops a value to some register. All constants are pushed on stack as double words, unless stated otherwise (pushing single bytes is not supported). +ESI // push esi -EDI // pop into edi +All // save all registers => pushad -All // load all registers => popad +$1badboo2 // push 0x1badboo2 on the stack +$cafe as word // \/ +$babe as word // push 0xcafebabe +#VideoMemory // push value of constant VideoMemory


Variables

Variables are defined within namespaces (as there are no stack frames, local variables aren't supported) using the var keyword. Arrays can be defined by adding the array's type and size on the end of the declaration. Variables and arrays are zeroed by default. To reference a variable's value, it must be prefixed with a dot. Prefixing that with an @ will reference the variable's address. namespace XSharpVariables var zeroVar // variable will be assigned zero var myVar1 = $f000beef // variable will be assigned 0xf000beef var someString = 'Hello XSharp!' // variable will be assigned 'Hello XSharp!\0', var buffer byte 024 // variable of size 1024 bytes will be assigned 1024 zero bytes ... EAX = .myVar1 // moves value of myVar1 (0xf000beef) to EAX ESI = @.someString // moves address of someString to ESI CL = .someString // moves first character of someString ('H') to CL .zeroVar = EAX // assigns zeroVar to value of EAX X# can access an address with a specified offset using square brackets: var someString = 'Hello XSharp!' //variable will be assigned to 'Hello XSharp!\0' ... ESI = @.someString // load address of someString to ESI CL = 'B' // set CL to 'B' (rewrite 'H' on the start) CH = ESI // move second character ('E') from string to CH ESI = $00 // end string //Value of someString will be 'Bell' (or 'Bell\0 XSharp!\0')


Comparison

There are two ways of comparing values: pure comparison and if-comparison. *Pure comparison leaves the result in FLAGS so it can be used in native assembly or using the if keyword without specifying comparison members. *If comparison compares two members directly after an if keyword. Here are two ways of writing a (slow) X# string length (strlen)function: // Method 1: using pure comparison function strlen { ESI = ESP // get pointer to string passed as first argument ECX ^ ECX // clear ECX Loop: AL = ESI CX/ get next character AL ?= 0 // is it 0? save to FLAGS if = return // if ZF is set, return ECX++ // else increment ECX goto Loop // loop... //Way 2: using if function strlen { ESI = ESP // get pointer to string passed as first argument ECX ^ ECX // clear ECX Loop: AL = ESI CX if AL = 0 return// AL = 0? return ECX++ goto Loop // loop.... } There are six available comparison operators: < > = <= >= !=. These operators can be used in both comparisons and loops. Note that there's also a
bitwise AND In computer programming, a bitwise operation operates on a bit string, a bit array or a binary numeral (considered as a bit string) at the level of its individual bits. It is a fast and simple action, basic to the higher-level arithmetic oper ...
operator which tests bits: AL ?& $80 // test AL MSB if = return // if ZF is 0, test instruction resulted in 0 and MSB is not set.


Writing Cosmos code

An operating system built with Cosmos is developed in a similar fashion to any .NET C# console program. Additional references are made in the start of the program which give access to the Cosmos libraries.


User Kit and Visual Studio

The Cosmos User Kit is a part of Cosmos designed to make Cosmos easier to use for developers using Microsoft Visual Studio. When installed, the user kit adds a new project type to Visual Studio, called a Cosmos Project. This is a modified version of a console application, with the Cosmos
compiler In computing, a compiler is a computer program that translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primarily used for programs tha ...
and bootup stub code already added.


Compiling a project

Once the code is complete, it may be compiled using Roslyn, the .NET compiler, either via Microsoft Visual Studio or the .NET command-line tools (dotnet). This converts the application from the original source code ( C# or otherwise) into
Common Intermediate Language Common Intermediate Language (CIL), formerly called Microsoft Intermediate Language (MSIL) or Intermediate Language (IL), is the intermediate language binary instruction set defined within the Common Language Infrastructure (CLI) specification. ...
(CIL), the native intermediate language of .NET. The build process then invokes the IL2CPU compiler which systematically scans through all of the applications CIL code (excluding the Cosmos compiler code), converting it into assembly language for the selected processor architecture. , only the
x86 x86 (also known as 80x86 or the 8086 family) is a family of complex instruction set computer (CISC) instruction set architectures initially developed by Intel based on the Intel 8086 microprocessor and its 8088 variant. The 8086 was intr ...
architecture is supported. Next, Cosmos invokes the selected assembler to convert this assembly language code into native
central processing unit A central processing unit (CPU), also called a central processor, main processor or just Processor (computing), processor, is the electronic circuitry that executes Instruction (computing), instructions comprising a computer program. The CPU per ...
(CPU) opcode. Finally, the desired output option is activated, be this starting a virtual machine, starting a PXE engine, or producing an ISO
disk image A disk image, in computing, is a computer file containing the contents and structure of a disk volume or of an entire data storage device, such as a hard disk drive, tape drive, floppy disk, optical disc, or USB flash drive. A disk image is us ...
file.


Debug options

Cosmos offers several options as to how to deploy the resulting OS and how to debug the output.


Virtualization

Cosmos allows users to boot the
operating system An operating system (OS) is system software that manages computer hardware, software resources, and provides common services for computer programs. Time-sharing operating systems schedule tasks for efficient use of the system and may also i ...
in an emulated environment using a
virtual machine In computing, a virtual machine (VM) is the virtualization/ emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer. Their implementations may involve specialized h ...
. This lets developers test the system on their own computer without having to reboot, giving the advantages of not requiring extra hardware or that developers exit their
integrated development environment An integrated development environment (IDE) is a software application that provides comprehensive facilities to computer programmers for software development. An IDE normally consists of at least a source code editor, build automation tools ...
(IDE). VMware is the primary virtualisation method, however others are supported such as
QEMU QEMU is a free and open-source emulator (Quick EMUlator). It emulates the machine's central processing unit, processor through dynamic binary translation and provides a set of different hardware and device models for the machine, enabling it t ...
and Hyper-V.


Disk images

This option writes the operating system to a
disk image A disk image, in computing, is a computer file containing the contents and structure of a disk volume or of an entire data storage device, such as a hard disk drive, tape drive, floppy disk, optical disc, or USB flash drive. A disk image is us ...
(
ISO image An optical disc image (or ISO image, from the ISO 9660 file system used with CD-ROM media) is a disk image that contains everything that would be written to an optical disc, disk sector by disc sector, including the optical disc file system. ...
) file, which can be loaded into some emulators (such as
Bochs Bochs (pronounced "box") is a portable IA-32 and x86-64 IBM PC compatible emulator and debugger mostly written in C++ and distributed as free software under the GNU Lesser General Public License. It supports emulation of the processor(s) (includin ...
,
QEMU QEMU is a free and open-source emulator (Quick EMUlator). It emulates the machine's central processing unit, processor through dynamic binary translation and provides a set of different hardware and device models for the machine, enabling it t ...
or more commonly
VMware VMware, Inc. is an American cloud computing and virtualization technology company with headquarters in Palo Alto, California. VMware was the first commercially successful company to virtualize the x86 architecture. VMware's desktop software ru ...
) or written to a
USB flash drive Universal Serial Bus (USB) is an industry standard that establishes specifications for cables, connectors and protocols for connection, communication and power supply ( interfacing) between computers, peripherals and other computers. A bro ...
and booted on physical hardware.


PXE network boot

This option allows the operating system to boot on physical hardware. The data is sent via a
local area network A local area network (LAN) is a computer network that interconnects computers within a limited area such as a residence, school, laboratory, university campus or office building. By contrast, a wide area network (WAN) not only covers a larger ...
(LAN) to the
client Client(s) or The Client may refer to: * Client (business) * Client (computing), hardware or software that accesses a remote service on another computer * Customer or client, a recipient of goods or services in return for monetary or other valuabl ...
machine. This requires two computers: one as the client machine (on which the OS is booted) and one as the server (usually the development machine). It also requires a network connecting the two computers, a client machine with a
network card A network interface controller (NIC, also known as a network interface card, network adapter, LAN adapter or physical network interface, and by similar terms) is a computer hardware component that connects a computer to a computer network. Ear ...
, and a Basic Input/Output System ( BIOS) that can PXE boot. , debugging over a network is unsupported.


See also

* IL2CPU * .NET *
SharpOS SharpOS is a discontinued computer operating system based on the .NET Framework and related programming language C Sharp (programming language), C#. It was developed by a group of volunteers and presided over by a team of six project administrat ...
*
Singularity (operating system) Singularity is an experimental operating system developed by Microsoft Research between July 9, 2003, and February 7, 2015. It was designed as a high dependability OS in which the kernel, device drivers, and application software were all writte ...
*
Phantom OS Phantom OS is an operating system (OS) made by mostly Russian programmers (with help of some Uzbeks). It is based on a concept of persistent virtual memory, and uses a virtual machine, managed code, and bytecodes. It is one of a few OSes not bas ...


References


External links

* *
Cosmos Overview article at CodeProject

Cosmos Dev Yahoo Group

Cosmos Fan Page on Facebook


News coverage


Mary Jo Foley on ZDNet - Cosmos: An open-source .Net-based microkernel OS is born

Scott Hanselman: Tiny Managed Operating System Edition
{{Operating systems Embedded operating systems Operating system kernels Free software operating systems Beta software X86 operating systems .NET Software using the BSD license